

<!DOCTYPE html>
<html>
<head>
    <title>Pilgrim</title>

    <!-- meta -->
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- css -->
    <link rel="stylesheet" href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
    <link rel="stylesheet" href="/static/blog/css/bootstrap.min.css">
    <link rel="stylesheet" href="/static/blog/css/pace.css">
    <link rel="stylesheet" href="/static/blog/css/custom.css">
    <link rel="stylesheet" href="/static/blog/css/highlights/github.css">

    <style>
        span.highlighted {
            color: yellow;
        }
    </style>

    <!-- js -->
    <script src="/static/blog/js/jquery-2.1.3.min.js"></script>
    <script src="/static/blog/js/bootstrap.min.js"></script>
    <script src="/static/blog/js/pace.min.js"></script>
    <script src="/static/blog/js/modernizr.custom.js"></script>
</head>

<body>
<div class="container">
    <header id="site-header">
        <div class="row">
            <div class="col-md-4 col-sm-5 col-xs-8">
                <div class="logo">
                    <h1><a href="/"><b>Pilgrim</b></a></h1>
                </div>
            </div><!-- col-md-4 -->
            <div class="col-md-8 col-sm-7 col-xs-4">
                <nav class="main-nav" role="navigation">
                    <div class="navbar-header">
                        <button type="button" id="trigger-overlay" class="navbar-toggle">
                            <span class="ion-navicon"></span>
                        </button>
                    </div>

                    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                        <ul class="nav navbar-nav navbar-right">
                            <li class="cl-effect-11"><a href="/" data-hover="首页">首页</a></li>
                            <li class="cl-effect-11"><a href="#" data-hover="博客">博客</a></li>
                            <li class="cl-effect-11"><a href="#" data-hover="关于">关于</a></li>
                            <li class="cl-effect-11"><a href="#" data-hover="联系">联系</a></li>
                        </ul>
                    </div><!-- /.navbar-collapse -->
                </nav>
                <div id="header-search-box">
                    <a id="search-menu" href="#"><span id="search-icon" class="ion-ios-search-strong"></span></a>
                    <div id="search-form" class="search-form">
                        <form role="search" method="get" id="searchform" action="/search/">
                            <input type="search" name="q" placeholder="搜索" required>
                            <button type="submit"><span class="ion-ios-search-strong"></span></button>
                        </form>
                    </div>
                </div>
            </div><!-- col-md-8 -->
        </div>
    </header>
</div>
<div class="copyrights">Collect from <a href="#">blog</a></div>
<div class="copyrights">Modified by <a href="#">博客</a></div>

<div class="content-body">
    <div class="container">
        <div class="row">
            <main class="col-md-8">
                
    <article class="post post-10">
        <header class="entry-header">
            <h1 class="entry-title">redis事务、集群</h1>
            <div class="entry-meta">
                <span class="post-category">
                    <a href="/category/6/">redis</a></span>
                <span class="post-date"><a href="#"><time class="entry-date"
                                                          datetime="2019年8月23日 14:43">2019年8月23日 14:43</time></a></span>
                <span class="post-author"><a href="#">chenjj</a></span>
                <span class="comments-link">
                    <a href="/post/10/#comment-area">0 评论</a></span>
                <span class="views-count"><a href="#">12 阅读</a></span>
            </div>
        </header>
        <div class="entry-content clearfix">
            <p>Redis事务
基本事务指令
Redis提供了一定的事务支持，可以保证一组操作原子执行不被打断，但是如果执行中出现错误，事务不能回滚，Redis未提供回滚支持。</p>
<div class="codehilite"><pre><span></span>    multi开启事务
    exec执行事务
</pre></div>


<p>使用multi开启事务后，操作的指令并未立即执行，而是被redis记录在队列中，等待一起执行。当执行exec命令后，开始执行事务指令，最终得到每条指令的结果。
如果事务中出现了错误，事务并不会终止执行，而是只会记录下这条错误的信息，并继续执行后面的指令。所以事务中出错不会影响后续指令的执行。</p>
<div class="codehilite"><pre><span></span>       其实在python代码中就是 管道 pipeline
</pre></div>


<p>watch监视</p>
<div class="codehilite"><pre><span></span>     若在构建的redis事务在执行时依赖某些值，可以使用watch对数据值进行监视。
     事务exec执行前被监视的stock值未变化，事务正确执行。
     若此时在另一个客户端修改stock的值并执行。当第一个客户端再执行exec时
     表明事务需要监视的stock值发生了变化，事务不能执行了。
                          注意：Redis Cluster 集群不支持事务
</pre></div>


<p>Redis持久化</p>
<p>redis可以将数据写入到磁盘中，在停机或宕机后，再次启动redis时，将磁盘中的备份数据加载到内存中恢复使用。这是redis的持久化。持久化有如下两种机制。</p>
<div class="codehilite"><pre><span></span> RDB 快照持久化
      redis可以将内存中的数据写入磁盘进行持久化。在进行持久化时，redis会创建子进程来执行。
      redis默认开启了快照持久化机制。
</pre></div>


<p>进行快照持久化的时机如下</p>
<div class="codehilite"><pre><span></span>      定期触发
      redis的配置文件

      BGSAVE
      执行BGSAVE命令，手动触发RDB持久化
     SHUTDOWN
     关闭redis时触发
</pre></div>


<p>AOF 追加文件持久化</p>
<div class="codehilite"><pre><span></span>     redis可以将执行的所有指令追加记录到文件中持久化存储，这是redis的另一种持久化机制。
     redis默认未开启AOF机制。
     redis可以通过配置如下项开启AOF机制
    AOF机制记录操作的时机
</pre></div>


<p>使用AOF机制的缺点是随着时间的流逝，AOF文件会变得很大。但redis可以压缩AOF文件。
结合使用
redis允许我们同时使用两种机制，通常情况下我们会设置AOF机制为everysec 每秒写入，则最坏仅会丢失一秒内的数据。</p>
<p>Redis高可用</p>
<div class="codehilite"><pre><span></span>  为了保证redis最大程度上能够使用，redis提供了主从同步+Sentinel哨兵机制。
  redis提供的哨兵是用来看护redis实例进程的，可以自动进行故障转移。
  在redis安装后，会自带sentinel哨兵程序，修改sentinel.conf配置文件

   bind 127.0.0.1
   port 26380
   daemonize yes
   logfile /var/log/redis-sentinel.log
   sentinel monitor mymaster 127.0.0.1 6380 2
   sentinel down-after-milliseconds mymaster 30000
   sentinel parallel-syncs mymaster 1
   sentinel failover-timeout mymaster 180000
   sentinel monitor mymaster 127.0.0.1 6380 2 说明
   mymaster 为sentinel监护的redis主从集群起名
   127.0.0.1 6300 为主从中任一台机器地址
   2 表示有两台以的sentinel认为某一台redis宕机后，才会进行自动故障转移。
   启动方式：
   redis-sentinel sentinel.conf
</pre></div>


<p>高可用方案注意事项</p>
<div class="codehilite"><pre><span></span>   至少三个sentinel以上
   sentinel要分散运行在不同的机器上
</pre></div>


<p>集群</p>
<div class="codehilite"><pre><span></span> 即使有了主从复制，每个数据库都要保存整个集群中的所有数据，容易形成木桶效应。
 实现分片集群，是由客户端控制哪些key数据保存到哪个数据库中，如果在水平扩容时就必须手动进 
 行数 
 据迁移，而且需要将整个集群停止服务，这样做非常不好的。
 Redis3.0版本的一大特性就是集群（Cluster）
</pre></div>


<p>故障机制</p>
<div class="codehilite"><pre><span></span> 集群中的每个节点都会定期的向其它节点发送PING命令，并且通过有没有收到回复判断目标节点是否 
 下线；
 集群中每一秒就会随机选择5个节点，然后选择其中最久没有响应的节点放PING命令；
 如果一定时间内目标节点都没有响应，那么该节点就认为目标节点疑似下线；
 当集群中的节点超过半数认为该目标节点疑似下线，那么该节点就会被标记为下线；
 当集群中的任何一个节点下线，就会导致插槽区有空档，不完整，那么该集群将不可用；
 如何解决上述问题？
 在Redis集群中可以使用主从模式实现某一个节点的高可用
 当该节点（master）宕机后，集群会将该节点的从数据库（slave）转变为（master）继续完成集群 
 服务。
</pre></div>
            <div class="widget-tag-cloud">
                <ul>
                    标签：
                    
                </ul>
            </div>
        </div>
    </article>
    <section class="comment-area" id="comment-area">
        <hr>
        <h3>发表评论</h3>
        <form action="/comment/post/10/" method="post" class="comment-form">
            
            <div class="row">
                <div class="col-md-4">
                    <label for="id_name">名字：</label>
                    <input id="id_name" maxlength="100" name="name" type="text" required />
                    
                </div>
                <div class="col-md-4">
                    <label for="id_email">邮箱：</label>
                    <input id="id_email" maxlength="255" name="email" type="email" required />
                    
                </div>
                <div class="col-md-4">
                    <label for="id_url">URL：</label>
                    <input id="id_url" maxlength="200" name="url" type="url" />
                    
                </div>
                <div class="col-md-12">
                    <label for="id_text">评论：</label>
                    <textarea cols="40" id="id_text" name="text" rows="10" required>
</textarea>
                    
                    <button type="submit" class="comment-btn">发表</button>
                </div>
            </div>    <!-- row -->
        </form>
        <div class="comment-list-panel">
            <h3>评论列表，共 <span>0</span> 条评论</h3>
            <ul class="comment-list list-unstyled">
                
                    暂无评论
                
            </ul>
        </div>
    </section>

            </main>
            <aside class="col-md-4">
                
    <div class="widget widget-content">
        <h3 class="widget-title">文章目录</h3>
        <div class="toc">
<ul></ul>
</div>

    </div>

                <div class="widget widget-recent-posts">
                    <h3 class="widget-title">最新文章</h3>
                    
                    <ul>
                        
                            <li>
                                <a href="/post/23/">数据分析推荐书籍</a>
                            </li>
                        
                            <li>
                                <a href="/post/32/">提高并发的方法</a>
                            </li>
                        
                            <li>
                                <a href="/post/25/">Python数据结构与算法（几种排序）</a>
                            </li>
                        
                            <li>
                                <a href="/post/21/">下山</a>
                            </li>
                        
                            <li>
                                <a href="/post/19/">cjj</a>
                            </li>
                        
                    </ul>
                </div>
                <div class="widget widget-archives">
                    <h3 class="widget-title">归档</h3>
                    
                    <ul>
                        
                            <li>
                                <a href="/archives/2019/12/">2019
                                    年 12 月</a>
                            </li>
                        
                            <li>
                                <a href="/archives/2019/10/">2019
                                    年 10 月</a>
                            </li>
                        
                            <li>
                                <a href="/archives/2019/8/">2019
                                    年 8 月</a>
                            </li>
                        
                    </ul>
                </div>

                <div class="widget widget-category">
                    <h3 class="widget-title">分类</h3>
                    
                    <ul>
                        
                            <li>
                                <a href="/category/1/">陈俊杰 <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/2/">数据库 <span
                                        class="post-count">(6)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/3/">消息队列 <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/4/">http、tcp/ip <span
                                        class="post-count">(6)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/5/">多任务 <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/6/">redis <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/7/">git <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/8/">状态保持 <span
                                        class="post-count">(2)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/10/">Docker <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/11/">搜索引擎 <span
                                        class="post-count">(2)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/12/">数据分析 <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/13/">数据结构与算法 <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/14/">markdown语法 <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/15/">非阻塞式IO <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                    </ul>
                </div>

                <div class="widget widget-tag-cloud">
                    <h3 class="widget-title">标签</h3>
                    
                    <ul>
                        
                            暂无标签！
                        
                    </ul>
                </div>

                <div class="rss">
                    <a href="#">才华撑不起野心，经济撑不起梦想</a>
                </div>
            </aside>
        </div>
    </div>
</div>
<footer id="site-footer">
    <div class="container">
        <div class="row">
            <div class="col-md-12">

                </p>
            </div>
        </div>
    </div>
</footer>

<!-- Mobile Menu -->
<div class="overlay overlay-hugeinc">
    <button type="button" class="overlay-close"><span class="ion-ios-close-empty"></span></button>
    <nav>
        <ul>
            <li><a href="/">首页</a></li>
            <li><a href="#">博客</a></li>
            <li><a href="#">关于</a></li>
            <li><a href="#">联系</a></li>
        </ul>
    </nav>
</div>

<script src="/static/blog/js/script.js"></script>

</body>
</html>
